/* libwatopt++ - Optimization Toolkit
 *
 * Copyright (c) 2007 Christopher Alexander Watford
 * <christopher.watford@gmail.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 * $Id: sa_instrument.cpp 2 2007-05-06 18:01:15Z christopher.watford $
 */

#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>

#include <sa.hpp>
#include <sa_instrument.hpp>

namespace watopt
{
   CSV_SAInstrumentor::CSV_SAInstrumentor(const char* filename, size_t csv_step, bool stdOut)
      : _m_Filename(filename), _m_Step(csv_step), _m_Stdout(stdOut)
      , _m_Delim(",")
   {
   }

   CSV_SAInstrumentor::CSV_SAInstrumentor(const CSV_SAInstrumentor& other)
      : _m_Filename(other._m_Filename), _m_Step(other._m_Step), _m_Stdout(other._m_Stdout)
      , _m_Delim(other._m_Delim)
   {
   }

   CSV_SAInstrumentor&
   CSV_SAInstrumentor::operator=(const CSV_SAInstrumentor& other)
   {
      if(&other != this)
      {
         _m_Filename = other._m_Filename;
         _m_Step = other._m_Step;
         _m_Stdout = other._m_Stdout;
         _m_Delim = other._m_Delim;
      }

      return (*this);
   }

   void
   CSV_SAInstrumentor::Start(void)
   {
      _m_os.open(_m_Filename.c_str(), std::ios_base::out);
   }

   void
   CSV_SAInstrumentor::BeforeSelect(size_t step, double temp, double best)
   {
      if(!(step % _m_Step) && _m_Stdout)
      {
         std::cout
            << "KK(" << step << ") "
   	      << "TT(" << temp << ") "
		      << "Best(" << best << ")"
            << std::endl;
      }
   }

   void
   CSV_SAInstrumentor::AfterSelect(size_t step, double temp, double best, double current, bool accepted)
   {
      if(step % _m_Step)
         return;

      _m_os
         << step << _m_Delim
   	   << temp << _m_Delim
		   << best << _m_Delim
		   << current << _m_Delim
		   << std::boolalpha << accepted
         << std::endl;
   }

   void
   CSV_SAInstrumentor::Stop(double best)
   {
      if(_m_Stdout)
         std::cout << "Best " << best << std::endl;

      _m_os.close();
   }
}
